// #include <stdio.h>
// #include <unistd.h>
// #include <fcntl.h>
// #include <string.h>

// /**
// 标准输入输出流 （File *）
//     FILE *stdin;   标准输入
//     FILE *stdout;  标准输出
//     FILE *stderr;  标准错误输出
// 标准输出输出流的文件描述符
//     STDIN_FILENO    0  标准输入
//     STDOUT_FILENO   1  标准输出
//     STDERR_FILENO   2  标准错误输出
//  */
// int main(int argc, char const *argv[])
// {
//     // 利用标准输入stdin读取终端输入
//     char input_name[10];
//     fgets(input_name, 10, stdin);
//     printf("stdin输入内容: %s", input_name);
//     // 利用标准输出stdout向终端输出
//     fputs("stdout输出内容\n", stdout);
//     // 利用标准错误输出stderr向终端输出
//     fputs("stderr输出内容 \n", stderr);
//     // 利用STDIN_FILENO读取终端输入
//     char input_name2[10];
//     ssize_t len = read(STDIN_FILENO, input_name2, 10);
//     printf("STDIN_FILENO输入内容: %.*s", (int)len, input_name2);
//     // 利用STDOUT_FILENO向终端输出
//     char *str = "STDOUT_FILENO输出内容\n";
//     write(STDOUT_FILENO, str, strlen(str));
//     // 利用STDERR_FILENO向终端输出
//     char *str2 = "STDERR_FILENO输出内容\n";
//     write(STDERR_FILENO, str2, strlen(str2));
//     return 0;
// }

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

/**
标准输入输出流 （File *）
    FILE *stdin;   标准输入
    FILE *stdout;  标准输出
    FILE *stderr;  标准错误输出
标准输出输出流的文件描述符
    STDIN_FILENO    0  标准输入
    STDOUT_FILENO   1  标准输出
    STDERR_FILENO   2  标准错误输出
 */

int main(int argc, char const *argv[])
{
    // 关闭标准输出和标准错误输出
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 打开正常日志文件流（标准输出）
    open("std.log", O_CREAT | O_WRONLY | O_APPEND, 0644); // fd必然为1
    // 打开错误日志文件流（标准错误输出）
    open("err.log", O_CREAT | O_WRONLY | O_APPEND, 0644); // fd必然为2

    // 使用stdin读取输入
    char input_name[10];
    fgets(input_name, sizeof(input_name), stdin);
    printf("使用stdin读取输入：%s", input_name); // 内部使用了stdout

    // 使用stdout显示输出
    fputs("使用stdout显示输出 \n", stdout);

    // 使用stderr显示错误信息
    fputs("使用stderr显示错误信息 \n", stderr);

    // 使用STDIN_FILENO读取输入
    char input_name2[10];
    int len = read(STDIN_FILENO, input_name2, sizeof(input_name2));
    printf("使用STDIN_FILENO读取输入：%.*s", len, input_name2);

    // 使用STDOUT_FILENO显示输出
    write(STDOUT_FILENO, "使用STDOUT_FILENO显示输出 \n", strlen("使用STDOUT_FILENO显示输出 \n"));

    // 使用STDERR_FILENO显示错误信息
    write(STDERR_FILENO, "使用STDERR_FILENO显示错误信息 \n", strlen("使用STDERR_FILENO显示错误信息 \n"));

    return 0;
}
